"""
API工具模块

这个模块提供了调用API接口的工具类。
从配置文件读取API相关设置，提供简单的接口调用方法。
"""
import json
import requests
from typing import Optional, Dict, Any
from src.config import GlobalConfig

class ApiClient:
    """
    API客户端类
    
    提供了调用API接口的方法，配置从GlobalConfig读取。
    支持自定义请求参数和错误处理。
    """
    
    def __init__(self):
        """初始化API客户端，从配置中读取必要参数"""
        self.base_url = GlobalConfig.get_config('base_url')
        if not self.base_url:
            raise ValueError("base_url未在配置中设置")
            
        self.api_key = GlobalConfig.get_config('api_key')
        if not self.api_key:
            raise ValueError("api_key未在配置中设置")
            
        self.model = GlobalConfig.get_config('model') or "deepseek-chat"
        
    def get_completion(self, prompt: str, system_message: str = "You are a helpful assistant", 
                      history_messages: Optional[list[Dict[str, str]]] = None) -> str:
        """
        调用API获取补全响应
        
        Args:
            prompt: 用户输入的提示文本
            system_message: 系统消息，设置助手的行为
            history_messages: 历史对话消息列表，每个元素格式为 {"role": str, "content": str}

        Returns:
            API的响应文本

        Raises:
            Exception: 当API调用失败时
        """
        try:
            # 准备消息列表
            messages = [{"role": "system", "content": system_message}]
            
            # 如果存在历史消息，将其添加到system message之后
            if history_messages:
                messages.extend(history_messages)
                
            # 添加当前用户消息
            messages.append({"role": "user", "content": prompt})
            
            # 准备请求数据
            data = {
                "model": self.model,
                "messages": messages
            }
            
            # 准备请求头
            headers = {
                "Content-Type": "application/json",
                "Authorization": f"Bearer {self.api_key}"
            }
            
            # 发送POST请求
            response = requests.post(
                f"{self.base_url.rstrip('/')}/chat/completions",
                headers=headers,
                json=data,
                timeout=600,  # 设置10分钟超时
                proxies={"http": None, "https": None}  # 禁用代理
            )
            
            # 检查响应状态
            response.raise_for_status()
            
            # 解析响应
            result = response.json()
            
            # 提取回复内容
            if 'choices' in result and len(result['choices']) > 0:
                return result['choices'][0]['message']['content']
            else:
                raise ValueError("API响应格式不正确")
                
        except requests.exceptions.RequestException as e:
            raise Exception(f"API请求失败: {str(e)}")
        except json.JSONDecodeError as e:
            raise Exception(f"解析API响应失败: {str(e)}")
        except Exception as e:
            raise Exception(f"调用API时发生错误: {str(e)}") 